1、Spring Boot 对实体对象的校验
1.1、搭建环境
1.1.1、创建项目
1.1.2、创建实体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class Users { private Integer userid; private String username; private String usersex; public Integer getUserid() { return userid; } public void setUserid(Integer userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUsersex() { return usersex; } public void setUsersex(String usersex) { this.usersex = usersex; } }
|
1.1.3、创建Controller
1 2 3 4 5 6 7 8 9
| @Controller @RequestMapping("/users") public class UsersController { @RequestMapping("/addUser") public String addUser(Users user){ System.out.println(user); return "ok"; } }
|
1.1.4、创建页面
1 2 3 4 5 6 7 8 9 10
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Title</title> </head> <body> <h2>成功了!!!!</h2> </body> </html>
|
1.2、对实体对象做数据校验
1.2.1、Spring Boot 数据校验的技术特点
Spring Boot 中使用了 Hibernate-validator 校验框架,Spring Boot的web启动器中已经包含了这个框架。
1.2.2、对实体对象数据校验步骤
1.2.2.1、修改实体类添加校验规则
每个注释都有默认的提示信息,如果要自定义提示信息,则可以在注释后面添加(message = “提示信息”)来自定义提示信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
public class Users { @NotNull(message = "用户名ID不能为空") private Integer userid; @NotBlank(message = "用户姓名不能为空") private String username; @NotBlank(message = "用户性别不能为空") private String usersex; public Integer getUserid() { return userid; } public void setUserid(Integer userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUsersex() { return usersex; } public void setUsersex(String usersex) { this.usersex = usersex; } @Override public String toString() { return "Users{" + "userid=" + userid + ", username='" + username + '\'' + ", usersex='" + usersex + '\'' + '}'; } }
|
1.2.2.2、在Controller中开启校验
如果有多个数据需要校验,则需要在每个数据后都添加BindingResult。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Controller @RequestMapping("/users") public class UsersController { @RequestMapping("/addUser") public String addUser(@Validated Users user, BindingResult result){ if(result.hasErrors()){ List<ObjectError> list = result.getAllErrors(); for (ObjectError err : list){ FieldError fieldError = (FieldError)err; String fieldName = fieldError.getField(); String msg = fieldError.getDefaultMessage(); System.out.println(fieldName+"/t"+msg); } return "addUser"; } System.out.println(user); return "ok"; } }
|
1.2.2.3、在页面中获取提示信息
1 2
| <span th:error="${users.username}"></span> <span th:errpr="${users.usersex}"></span>
|
1.2.3、在配置文件中定义提示信息
除了用上面的方式去定义提示信息外,还可以在配置文件中去定义提示信息,配置文件名称必须是ValidationMessages.properties,需要用的时候可以使用 @NotNull(message = “{userid.notnull}”)方式使用。
在properties中默认是ios编码的,如果没有转换编码会出现乱码的情况。这个时候可以使用jdk中自带的小工具native2ascii.exe进行编码转换。
)
1.2.4、解决页面跳转异常
如果在页面跳转的时候,页面中没有 th:error 里的数据,会出现报错。
解决方法是在跳转页面的方法中注入一个对象,要求参数对象的变量名必须是对象类型名称首字母小写格式。
1 2 3 4 5 6 7 8 9 10 11 12
| @Controller public class PageController {
@RequestMapping("/{page}") public String pageController(@PathVariable String page, Users suibian){ return page; } }
|
1
| <span th:error="${users.username}"></span>
|
1.2.5、修改参数key的名称
@ModelAttribute(“自定义的key”)
1 2 3 4
| @RequestMapping("/{page}") public String pageController(@PathVariable String page, @ModelAttribute("aa") Users users){ return page; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @RequestMapping("/addUser") public String addUser(@ModelAttribute("aa") @Validated Users user, BindingResult result){ if(result.hasErrors()){ List<ObjectError> list = result.getAllErrors(); for (ObjectError err : list){ FieldError fieldError = (FieldError)err; String fieldName = fieldError.getField(); String msg = fieldError.getDefaultMessage(); System.out.println(fieldName+"/t"+msg); } } System.out.println(user); return "ok"; }
|
1
| <span th:error="${aa.username}"></span>
|
1.2.6、其他校验规则
- @NotNull:判断基本数据类型的对象类型是否为null
- @NotBlank:判断字符串是否为null或者是空串(去掉首尾空格)
- @NotEmpty:判断集合是否为空
- @Length:判断字符长度(最大或者最小)
- @Min:判断数值最小值
- @Max:判断数值最大值
- @Email:判断邮箱是否合法
2、Spring Boot 对 Controller 中其他参数的校验
2.1、编写页面
1 2 3 4 5 6 7 8 9 10 11 12 13
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Title</title> </head> <body> <form th:action="@{/user/findUser}" method="post"> <input type="text" name="username"><font color="red"><span th:text="${error}"></span></font> <br/> <input type="submit" value="提交"> </form> </body> </html>
|
2.2、对参数指定校验规则
1 2 3 4 5
| @PostMapping("/findUser") public String findUser(@NotBlank(message = "用户名不能为空") String username){
return "ok"; }
|
2.3、在Controller中开启校验
1 2 3 4
| @Controller @RequestMapping("/users") @Validated public class UsersController {...
|
2.4、通过全局异常处理来跳转页面
1 2 3 4 5 6 7 8 9 10 11 12
| @Configuration public class GlobalException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv = new ModelAndView(); if(e instanceof ConstraintViolation){ mv.setViewName("findUser"); } mv.addObject("error",e.getMessage().split(":")[1]); return mv; } }
|